#pragma once

/*
 * KV 命令条目
 */

#include "raft_utils/Command.h"

class KVCommand : public raft::utils::Command {
public:
    // 序列化
    [[nodiscard]] std::string as_string() const override;

    // 反序列化
    bool parse_from_string(const std::string &str) override;

    // 清空所有成员函数
    void clear() override;

    // 命令类型
    enum class Command {
        None,
        INSERT,
        SET,
        DELETE,
        SEARCH,
    };

    [[nodiscard]] Command get_command() const;

    void set_command(Command command);

    [[nodiscard]] const std::string &get_key() const;

    void set_key(const std::string &key);

    [[nodiscard]] const std::string &get_value() const;

    void set_value(const std::string &value);

private:
    // 辅助序列化函数
    [[nodiscard]] std::string command_to_string() const;

    void string_to_command(const std::string &str);

    // 命令
    Command command_;
    // 键
    std::string key_;
    // 值
    std::string value_;
};